#include <memory>
#include <ctime>
#include "task.hpp"
#include "threadpool.hpp"


// using ThreadPool_t = ThreadPool<int>;
using ThreadPool_t = ThreadPool<Task>;

void assignTask(ThreadPool_t &tp, int num) // num表示任务数量
{
    // 任务是整形数据
    // int cnt = 1;
    // while (num--)
    // {
    //     tp.push(cnt);
    //     cout << "assigning task is: " << cnt++ << endl;
    //     sleep(1);
    // }

    srand((unsigned int)time(nullptr) ^ pthread_self());
    while (num--)
    {
        int a = rand() % 100;
        int b = rand() % 100;
        Task t(a, b);
        tp.push(t);
    }
}

int main()
{
    // 1、创建一个线程池
    // ThreadPool<int> tp(5);

    // //2、启动线程池（所有线程运行）
    // tp.start();

    // //3、安排任务
    // assignTask(tp, 20);

    // //4、关闭线程池
    // tp.stop();

    //准备工作
    EnableScreen(); //将日志信息输出到屏幕

    //EnableFile(); //将日志输出到文件中

    // 一种新的创建线程池方法
    // 1、创建一个线程池
    unique_ptr<ThreadPool_t> tp = make_unique<ThreadPool_t>(5); // c++14新特性：智能指针

    // 2、启动线程池（所有线程运行）
    tp->start();

    // 3、安排任务
    assignTask(*tp, 20);

    // 4、关闭线程池
    tp->stop();

    // 测试代码
    // LOG(DEBUG, "log");
    // LOG(DEBUG, "log:%d", 10);
    // LOG(DEBUG, "log:%d, %c", 10, 98);
    // LOG(DEBUG, "log:%d, %c, %s", 10, 98, "error");

    // testVargs(3, 11, 22, 33);

    return 0;
}